/**
  ******************************************************************************
  * @file    main.c 
  * @author  18408107475@163.com
  * @version V1.0.0
  * @date    2025-06-08
  * @brief   AT24C02 EEPROM读写测试主程序
  * @details 
  * 硬件配置：
  *   - MCU: STM32F103ZET6 (72MHz Cortex-M3)
  *   - AT24C02: 2Kbit(256x8)串行EEPROM，I2C接口
  *   - USART1: 用于调试输出（连接PC串口）
  * 
  * 软件特性：
  *   - 演示AT24C02的随机写、顺序读、当前地址读操作
  *   - 通过串口打印测试结果
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"          // STM32标准外设库（核心寄存器定义、中断控制器等）
#include "Delay.h"              // 精确延时函数库（基于SysTick实现，精度±1us）
#include "USART1_Config.h"      // USART1初始化及printf重定向（波特率115200）
#include "AT24C02_Config.h"     // AT24C02 EEPROM驱动

/* 私有变量定义 --------------------------------------------------------------*/
// 注：此处未定义全局变量，Data数组已在AT24C02_Config.h中声明为extern

/**
  ******************************************************************************
  * @brief  主程序入口
  * @param  None
  * @retval int 程序状态码（实际不会返回）
  * @note   系统执行流程：
  *         1. 初始化USART1用于调试输出
  *         2. 初始化AT24C02的I2C接口
  *         3. 向AT24C02写入测试数据('A'-'I')
  *         4. 执行多种读取操作并打印结果
  *         5. 进入主循环（示例中为空循环）
  ******************************************************************************
  */
int main(void)
{
    /* 硬件初始化阶段 ------------------------------------------------*/
    USART1_Config(115200);     // 初始化USART1（8N1，115200bps）
    AT24C02_Config();          // 初始化AT24C02的I2C接口

    /* AT24C02写入测试 ----------------------------------------------*/
    // 向不同地址写入字符'A'-'I'
    IIC_Write_Data(AT24C02_ADDRESS, 0xFF, 'A');  // 地址0xFF写入'A'
    IIC_Write_Data(AT24C02_ADDRESS, 0x00, 'B');  // 地址0x00写入'B'
    IIC_Write_Data(AT24C02_ADDRESS, 0x01, 'C');  // 地址0x01写入'C'
    IIC_Write_Data(AT24C02_ADDRESS, 0x02, 'D');  // 地址0x02写入'D'
    IIC_Write_Data(AT24C02_ADDRESS, 0x03, 'E');  // 地址0x03写入'E'
    IIC_Write_Data(AT24C02_ADDRESS, 0x04, 'F');  // 地址0x04写入'F'
    IIC_Write_Data(AT24C02_ADDRESS, 0x05, 'G');  // 地址0x05写入'G'
    IIC_Write_Data(AT24C02_ADDRESS, 0x06, 'H');  // 地址0x06写入'H'
    IIC_Write_Data(AT24C02_ADDRESS, 0x07, 'I');  // 地址0x07写入'I'
    
    /* AT24C02读取测试 ----------------------------------------------*/
    // 1. 随机读取地址0xFF的数据（应返回'A'）
    USART1_Printf("IIC READ: %c\r\n", IIC_Read_Data(AT24C02_ADDRESS, 0xFF));
    
    // 2. 顺序读取8字节数据（地址0x00-0x07，应返回'B'-'I'）
    AT24C02_Sequential_Read_Data(8,Data);
    USART1_SendArray(Data, 8);  // 通过串口发送读取到的8字节数据
    USART_SendString(USART1, "\r\n");  // 发送换行
    
    // 3. 随机读取地址0x00的数据（应返回'B'）
    USART1_Printf("Random READ: %c\r\n", AT24C02_Random_Read_Data(0x00));
    
    // 4. 当前地址读取（内部指针在上次操作后指向0x01，应返回'C'）
    USART1_Printf("Current READ: %c\r\n", AT24C02_Current_Read_Data());

    /* 主任务循环 ----------------------------------------------------*/
    while (1)
    {
        // 示例中为空循环，实际应用中可添加其他功能
        // 注意：AT24C02写入后需要5ms延迟才能进行下次操作（跨页写入时）
    }
    
    /* 程序理论上不会执行到此处 */
    return 0;                  // 符合C语言标准要求的返回值
}

/************************ (C) COPYRIGHT 2025 Embedded Team *****END OF FILE****/
